package xyz.icxl.kotlion.ext.primitives

import java.lang.Exception
import java.math.BigDecimal
import java.math.RoundingMode
import java.text.DecimalFormat


/**
 * Number转BigDecimal
 * 这是安全转换 转换失败会返回[BigDecimal.ZERO]
 */
val Number?.toBigDecimalOrZero: BigDecimal
    get() {
        return try {
            if (this != null)
                BigDecimal(this.toString())
            else
                BigDecimal.ZERO
        } catch (e: Exception) {
            BigDecimal.ZERO
        }
    }


/**
 * 数值格式化
 * 例如：
 *  12.395456 Format to 12.39
 *  135.231231213  Format 135.23
 *  19999.0  Format 19999
 */
fun Number?.format(): String {
    if (null == this) return "0"
    val newNumber =
        BigDecimal(this.toString()).setScale(2, BigDecimal.ROUND_DOWN)
            .toDouble()
//    val df = DecimalFormat("#.##")
    val df = DecimalFormat("0.00")
    return df.format(newNumber)
}


fun Number?.format2(): String {
    if (null == this) return "0"
    val newNumber =
        BigDecimal(this.toString()).setScale(2, BigDecimal.ROUND_DOWN)
            .toDouble()
    val df = DecimalFormat("#.##")
//    val df = DecimalFormat("0.00")
    return df.format(newNumber)
}

fun Number.format3(pattern:String = "00"):String{
    val df = DecimalFormat(pattern)
    return df.format(this)
}


/**
 * 数值格式化 会格式化到小数点后4位
 * 例如：
 *  12.395456 Format to 12.3954
 *  135.231231213  Format 135.2312
 *  19999.0  Format 19999
 */
fun Number?.formatScale4(): String {
    if (null == this) return "0"
    val newNumber =
        BigDecimal(this.toString()).setScale(4, BigDecimal.ROUND_DOWN)
            .toDouble()
//    val df = DecimalFormat("#.##")
    val df = DecimalFormat("0.0000")
    return df.format(newNumber)
}

/**
 * 乘法
 * @param bigDecimal 需要相乘的数
 * @param scale 小数点后多少位
 * @param roundingMode 四舍五入的模式[RoundingMode]
 */
fun Number.multiply(
    bigDecimal: BigDecimal,
    scale: Int = 2,
    roundingMode: RoundingMode = RoundingMode.DOWN
): BigDecimal {
    return toBigDecimal().multiply(bigDecimal).setScale(scale, roundingMode)
}

/**
 * 除法
 * @param bigDecimal 除数
 * @param scale 小数点后多少位
 * @param roundingMode 四舍五入的模式[RoundingMode]
 */
fun Number.division(
    bigDecimal: BigDecimal,
    scale: Int = 2,
    roundingMode: RoundingMode = RoundingMode.DOWN
): BigDecimal {
    return toBigDecimal().division(bigDecimal, scale, roundingMode)
}

/**
 * 加法
 * @param bigDecimal 需要相加的数
 */
fun Number.add(
    bigDecimal: BigDecimal
): BigDecimal {
    return toBigDecimal().add(bigDecimal)
}

/**
 * 减法
 */
fun Number.subtract(bigDecimal: BigDecimal): BigDecimal {
    return toBigDecimal().subtract(bigDecimal)
}

/**
 * [Number]类型的值转换为[BigDecimal]
 */
fun Number?.toBigDecimal(scale: Int = 2,roundingMode: RoundingMode = RoundingMode.DOWN):BigDecimal{
    return if (null == this ) BigDecimal.ZERO
    else BigDecimal(this.toString()).setScale(scale,roundingMode)
}